home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
HAM_RAD
/
PROPAGAT
/
3068.ZIP
/
MAPPER.ZIP
/
MAP-SUBS.BAS
< prev
next >
Wrap
BASIC Source File
|
1991-08-10
|
23KB
|
506 lines
100 DEFINT I-N
110 '$INCLUDE:'MAP-COM.INC'
200 '$INCLUDE:'MAP-DEF.INC'
10000 SUB PROPAGATE (METHOD,TLAT, TLON, RLAT, RLON, LPATH%, MONTH, DAY, TIME, SSN, NHOPS, EXTRA.HOPS%, F.MUF, F.LUF, E.CUTOFF,GMT) STATIC
10010 WIDTH LPRINT 128
10020 DIM M$(37), A$(4), M(12)
10030 X$ = STRING$(79, 61)
10040 HEIGHT.F2 = 275+SSN/2: HEIGHT.E = 110: HEIGHT.D = 90
10050 POL.LAT = 78.3 / CNV: POL.LON = 69 / CNV
10060 GMT = TIME - TLON / 15: GMT = FNT.MOD(GMT, 24)
10070 T.LAT = TLAT * RPD: T.LON = -TLON * RPD: R.LAT = RLAT * RPD: R.LON = -RLON * RPD:
10080 PHI = CNV * FNASIN(RE * COS(E.MIN / CNV) / (RE + HEIGHT.F2))
10090 TH = 180 - PHI - 90 - E.MIN
10100 GR.MAX = 2 * TH * RE / CNV
10110 GOSUB 12000: REM TO MAIN CALCULATION LOOP
10120 EXIT SUB
12000 REM MINIMUF 4.1 CALCULATION LOOP
12010 COS.GRNG = SIN(T.LAT) * SIN(R.LAT) + COS(T.LAT) * COS(R.LAT) * COS(R.LON - T.LON)
12020 GRNG = FNACOS(COS.GRNG): IF LPATH% THEN GRNG = 2 * PI - GRNG
12030 MIN.NHOPS = 1 + FIX(RE * GRNG / GR.MAX)'NUMBER OF 3500 KM HOPS
12040 NHOPS = MIN.NHOPS + EXTRA.HOPS%
12050 HOP.INV = 1! / NHOPS
12060 F.MUF = 100: E.CUTOFF = 0: F.LUF = 0
12070 ANG = .5 * GRNG / CSNG(NHOPS): R.SLANT = SQR(RE ^ 2 + (RE + HEIGHT.F2) ^ 2 - 2 * RE * (RE + HEIGHT.F2) * COS(ANG))
12080 ELEV = CNV * FNACOS((RE + HEIGHT.F2) * SIN(ANG) / R.SLANT)
12090 PHID = CNV * FNASIN(RE * COS(ELEV / CNV) / (RE + HEIGHT.D))' INCIDENCE ANGLE ON D LAYER AT 90 KM
12100 PATH.LOSS = 2 * FNDB(4 * PI * R.SLANT * 2 * NHOPS * 1000)
12110 ANG = GRNG / (1 + NHOPS): EL.MAX = ATN(1 / TAN(ANG) - (RE / (RE + HEIGHT.F2)) / SIN(ANG)): IF EL.MAX < 18 / CNV THEN EL.MAX = 18 / CNV
12120 SEC.EINC = 1 / SQR(1 - ((RE / (RE + HEIGHT.E)) * COS(EL.MAX)) ^ 2)
12130 FOR I = 1 TO NFREQ
12140 CALL MULTIPATH(ELEV, WAVE.LEN(I), H.TXANT(I), XMULTV, XMULTH): IF TX.POL%(I) THEN TX.LOSS(I) = XMULTV ELSE TX.LOSS(I) = XMULTH
12150 CALL MULTIPATH(ELEV, WAVE.LEN(I), H.RXANT(I), XMULTV, XMULTH): IF RX.POL%(I) THEN RX.LOSS(I) = XMULTV ELSE RX.LOSS(I) = XMULTH
12160 REF.LOSS(I) = 0: ABSORB.LOSS(I) = 0: NEXT I
13000 FOR KHOP = 1 TO NHOPS
13010 PATH.FRAC = (KHOP - .5) / NHOPS:
13020 REFL.PATH.FRAC = CSNG(KHOP - 1!) / NHOPS
13030 IF METHOD>0 THEN
13040 CTRL.POINTS%=-1
13050 ELSE
13060 IF KHOP=1 OR KHOP=NHOPS THEN
13070 CTRL.POINTS%=-1
13080 ELSE
13090 CTRL.POINTS%=0
13100 END IF
13110 END IF
13120 SIN.RLAT = SIN(R.LAT)
13130 COS.RLAT = COS(R.LAT)
13140 COS.RAZIM = (SIN(T.LAT) - SIN.RLAT * COS(GRNG)) / (COS.RLAT * SIN(GRNG))
13150 CTRL.RNG = GRNG * PATH.FRAC: REFL.RNG = GRNG * REFL.PATH.FRAC
13160 SIN.CLAT = SIN.RLAT * COS(CTRL.RNG) + COS.RLAT * SIN(CTRL.RNG) * COS.RAZIM
13170 SIN.RFLAT = SIN.RLAT * COS(REFL.RNG) + COS.RLAT * SIN(REFL.RNG) * COS.RAZIM
13180 COS.CLON = (COS(CTRL.RNG) - SIN.CLAT * SIN.RLAT) / (COS.RLAT * SQR(1 - SIN.CLAT ^ 2))
13190 COS.RFLON = (COS(REFL.RNG) - SIN.RFLAT * SIN.RLAT) / (COS.RLAT * SQR(1 - SIN.RFLAT ^ 2))
13200 CLON = FNACOS(COS.CLON): RFLON = FNACOS(COS.RFLON)
13210 C.LON = R.LON + SGN(SIN(T.LON - R.LON)) * CLON
13220 IF C.LON < 0 THEN C.LON = C.LON + PI2
13230 IF C.LON >= PI2 THEN C.LON = C.LON - PI2
13240 C.LAT = PI.D2 - FNACOS(SIN.CLAT)
13250 RF.LON = R.LON + SGN(SIN(T.LON - R.LON)) * RFLON
13260 IF RF.LON < 0 THEN RF.LON = RF.LON + PI2
13270 IF RF.LON >= PI2 THEN RF.LON = RF.LON - PI2
13280 RF.LAT = (PI.D2 - FNACOS(SIN.RFLAT)) * CNV
13290 RFL = CNV * RF.LON
13300 RF.LON = FNXFORM(-CNV * RF.LON,TLON)
13310 IF REFL.PATH.FRAC = 0 THEN GOTO 14020
13320 'IF POINT(RF.LON, RF.LAT) = 1 THEN SEA% = -1 ELSE SEA% = 0
13330 CALL FIND.OCEAN(RFL,RF.LAT,SEA%)
14000 FOR I = 1 TO NFREQ: CALL REFLECT(ELEV, WAVE.LEN(I), SEA%, RMV, VP, RMH, HP, REFLECT.LOSS)
14010 REF.LOSS(I) = REF.LOSS(I) + REFLECT.LOSS: NEXT I
14020 YR.ANGLE = .0172 * (10 + (MONTH - 1) * 30.4 + DAY)
14030 TILT.ANGLE = .409 * COS(YR.ANGLE): COSX1 = -1: COSX2 = -1: COSX3 = -1
14040 T.NOON = 3.82 * C.LON + 12 + .13 * (SIN(YR.ANGLE) + 1.2 * SIN(2 * YR.ANGLE))
14050 T.NOON = FNT.MOD(T.NOON, 24)
14060 IF COS(C.LAT + TILT.ANGLE) > -.26 THEN GOTO SUN.LIGHT
14070 T.SUN = 0
14080 COSX = 0
14090 M.FACT! = 2.5 * GRNG * HOP.INV
14100 IF M.FACT! > PI.D2 THEN M.FACT! = PI.D2
14110 M.FACT! = SIN(M.FACT!)
14120 M.FACT! = 1 + 2.5 * M.FACT! * SQR(M.FACT!)
14130 GOTO MUF.CALC
15000 SUN.LIGHT:
15010 T.SUN = (-.26 + SIN(TILT.ANGLE) * SIN(C.LAT)) / (COS(TILT.ANGLE) * COS(C.LAT) + 9.999999E-04)
15020 T.SUN = 12 - ATN(T.SUN / SQR(ABS(1 - T.SUN * T.SUN))) * 7.639437
15030 T.RISE = T.NOON - T.SUN / 2 + 12 * (1 - SGN(T.NOON - T.SUN / 2)) * SGN(ABS(T.NOON - T.SUN / 2))
15040 T.SET = T.NOON + T.SUN / 2 - 12 * (1 + SGN(T.NOON + T.SUN / 2 - 24)) * SGN(ABS(T.NOON + T.SUN / 2 - 24))
15050 COS.ZEN = ABS(COS(C.LAT + TILT.ANGLE))
15060 T.RELAX = 9.7 * COS.ZEN ^ 9.600001
15070 IF T.RELAX < .1 THEN T.RELAX = .1
15080 M.FACT! = 2.5 * GRNG * HOP.INV
15090 IF M.FACT! > PI.D2 THEN M.FACT! = PI.D2
15100 M.FACT! = SIN(M.FACT!)
15110 M.FACT! = 1 + 2.5 * M.FACT! * SQR(M.FACT!)
15120 IF T.SET < T.RISE THEN GOTO CHECK.TIME
15130 IF (GMT - T.RISE) * (T.SET - GMT) > 0 THEN GOTO DAY.TIME
16000 NITE.TIME:
16010 GMT0 = GMT + 12 * (1 + SGN(T.SET - GMT)) * SGN(ABS(T.SET - GMT))
16020 U0 = PI * T.RELAX / T.SUN
16030 U = (T.SET - GMT0) / 2
16040 U1 = -T.SUN / T.RELAX
16050 FRAC.SUN = PI * (GMT0 - T.SET) / (24 - T.SUN)
16060 COSX = COS.ZEN * (U0 * (EXP(U1) + 1)) * EXP(U) / (1 + U0 * U0): COSX1 = COSX
16070 FRAC.SUN = 0
16080 GOTO MUF.CALC
17000 CHECK.TIME:
17010 IF (GMT - T.SET) * (T.RISE - GMT) > 0 THEN GOTO NITE.TIME
18000 DAY.TIME:
18010 GMT0 = GMT + 12 * (1 + SGN(T.RISE - GMT)) * SGN(ABS(T.RISE - GMT))
18020 TAU0 = PI * (GMT0 - T.RISE) / T.SUN
18030 U0 = PI * T.RELAX / T.SUN
18040 U = (T.RISE - GMT0) / T.RELAX
18050 FRAC.SUN = PI * (GMT0 - T.RISE) / T.SUN
18060 COSX = COS.ZEN * (SIN(TAU0) + U0 * (EXP(U) - COS(TAU0))) / (1 + U0 * U0): COSX2 = COSX
18070 ALT.COSX = COS.ZEN * (U0 * (EXP(-T.SUN / T.RELAX) + 1)) * EXP((T.SUN - 24) / 2) / (1 + U0 * U0): COSX3 = ALT.COSX
18080 IF COSX >= ALT.COSX THEN GOTO MUF.CALC
18090 COSX = ALT.COSX
20000 MUF.CALC:
20010 MUF! = (1 + SSN / 250) * SQR(6 + 58 * SQR(COSX))
20020 F.VERT1 = MUF!
20030 MUF! = MUF! * (1 - .1 * EXP((T.SUN - 24) / 3))
20040 MUF! = MUF! * (1 + (1 - SGN(T.LAT) * SGN(R.LAT)) * .1)
20050 MUF! = MUF! * (1 - .1 * (1 + SGN(ABS(SIN(C.LAT)) - COS(C.LAT))))
20060 F.VERT = MUF!: MUF! = M.FACT! * MUF!:
20070 X.MONTH=MONTH
20080 IF ABS(METHOD)=1 THEN
20090 CALL CRIT.FREQ(C.LAT*CNV,C.LON*CNV,X.MONTH,GMT,SSN,ELEV,Z.MAG,HT.F2,F.VERT,MUF!)
20100 END IF
20110 M.FACT!=MUF!/F.VERT
21000 IF CTRL.POINTS% THEN IF MUF! < F.MUF THEN F.MUF = MUF!
21010 GOSUB ECUTOFF: GOSUB D.LOSS: GOSUB SIGNAL.STRENGTH:
21020 IF DIAGNOSTICS% THEN GOSUB PRINT.STUFF
21030 NEXT KHOP
21040 RETURN
24000 ECUTOFF: 'CALCULATE E LAYER CUTOFF FREQ
24010 E.FACT = .2: IF T.SUN = 0 THEN GOTO ESCREEN
24020 IF T.SUN * FRAC.SUN = 0 THEN GOTO ESCREEN
24030 E.COSX = COS.ZEN * SIN(PI * (GMT0 - T.RISE) / T.SUN)
24040 IF E.COSX > .174 THEN E.FACT = E.COSX ^ .3 ELSE E.FACT = (FNACOS(E.COSX) * CNV - 76) ^ -.4
24050 ESCREEN:
24060 E.SCREEN = (3.4 + .00544 * SSN) * E.FACT * SEC.EINC
24070 IF E.SCREEN > 7 THEN E.LUF = (1.33 * E.SCREEN - 3.31) ^ 2 / 7 ELSE E.LUF = .91 * E.SCREEN - .37
24080 IF CTRL.POINTS% THEN IF F.LUF < E.LUF THEN F.LUF = E.LUF
24090 IF CTRL.POINTS% THEN IF E.CUTOFF < E.SCREEN THEN E.CUTOFF = E.SCREEN
24100 RETURN
25000 D.LOSS: ' CALCULATE D REGION ABSORPTION
25010 IF METHOD<>1 THEN
25020 MAG.LAT! = FNASIN(COS(POL.LAT) * COS(C.LAT) * COS(POL.LON - C.LON) + SIN(POL.LAT) * SIN(C.LAT))
25030 ELSEIF METHOD=1 THEN
25040 MAG.LAT!=Z.MAG/CNV
25050 END IF
25060 F.GYRO = .8 * SQR(1 + 3 * SIN(MAG.LAT!) ^ 2)
25070 CHI = CNV * FNACOS(COS.ZEN * SIN(PI * (GMT0 - T.RISE) / T.SUN))
25080 IF CHI < 102 THEN XLOSS = 1.5 * 430 * (1 + .0035 * SSN) * COS(.881 * CHI / CNV) ^ .75 / (COS(PHID / CNV)) ELSE XLOSS = 0
25090 IF CHI < 102 THEN XINDEX = (1 + .0037 * SSN) * COS(.881 * CHI / CNV) ^ 1.3 ELSE XINDEX = 0
25100 IF XINDEX < .1 THEN XINDEX = .1
25110 XLOSS = 677.2 * XINDEX / (COS(PHID / CNV))
25120 FOR I = 1 TO NFREQ: ABSORB.LOSS(I) = ABSORB.LOSS(I) + XLOSS / ((FREQ(I) + F.GYRO) ^ 2 + 10.2): NEXT I
25130 RETURN
25140 SIGNAL.STRENGTH: 'CALCULATE SIGNAL STRENGTH
25150 FOR I = 1 TO NFREQ
25160 PR(I) = FNDB(PT) + GT(I) + TX.LOSS(I) + GR(I) + RX.LOSS(I) + REF.LOSS(I) - ABSORB.LOSS(I) + 2 * FNDB(WAVE.LEN(I)) - PATH.LOSS
25170 PR(I) = PR(I) - FNDB(.0000005 ^ 2 / 50)
25180 NEXT I: RETURN
29000 PRINT.STUFF:
29010 LPRINT USING "KHOP = ### GMT= ### Fv=#####.# Fv1=#####.# Mf= ##.### MUF= #####.# "; KHOP; GMT; F.VERT; F.VERT1; M.FACT!; MUF!
29020 LPRINT USING " HT.F2= #####.# #####.# Z.MAG= #####.# "; HEIGHT.F2,HT.F2,Z.MAG
29030 LPRINT USING " E.SCREEN=#####.# E.LUF=#####.# E.CUTOFF=#####.# F.LUF= #####.# "; E.SCREEN; E.LUF; E.CUTOFF; F.LUF
29040 LPRINT USING " C.LAT=####.# C.LON=####.# YR.ANGLE=####.# TILT.ANGLE=####.# COS.ZEN=##.###"; C.LAT * CNV; C.LON * CNV; YR.ANGLE * CNV; TILT.ANGLE * CNV; COS.ZEN
29050 LPRINT USING " R.LAT=####.# R.LON=####.# ELEV=####.# PHID=####.# R.SLANT=##### PATH.LOSS=####.#"; RF.LAT; RFL; ELEV; PHID; R.SLANT; PATH.LOSS
29060 FOR I = 1 TO NFREQ
29070 LPRINT USING " F= ###.# TX.LOSS=###.# RX.LOSS=###.# REF.LOSS=###.# ABSORB=###.# PR= ###.# ###"; FREQ(I); TX.LOSS(I); RX.LOSS(I); REF.LOSS(I); ABSORB.LOSS(I); PR(I); SEA%
29080 NEXT I
29090 LPRINT "": RETURN
29100 LPRINT USING " T.NOON=###.# T.SUN=###.# T.RISE=###.# T.SET=###.# T.RELAX=###.# "; T.NOON; T.SUN; T.RISE; T.SET; T.RELAX
29110 LPRINT USING " COSX=###.## COSX1=###.## COSX2=###.## COSX3=###.##"; COSX; COSX1; COSX2; COSX3
29120 LPRINT USING " TLAT=###.# TLON=###.# RLAT=###.# RLON=###.# GRNG=##### SSN=#### "; TLAT; TLON; RLAT; RLON; RE * GRNG; SSN
29130 LPRINT "": RETURN
29140 REM CALCULATION OF SUNSPOT NUMBER FROM SOLAR FLUX
29150 SSN = -103.7767 + 1.797429 * SF - (3.384356E-03) * SF ^ 2 + (4.525515E-06) * SF ^ 3
29160 SSN = INT(100 * SSN + .5) / 100
29170 RETURN
29180 END SUB
30000 SUB CRIT.FREQ(XN,YN,X.MONTH,T.UTC,R,AE,Z.MAG,HF,F0F2,F.MUF) STATIC
30010 '
30020 REM THIS IS THE F-LAYER ALGORITHM FOR MAXIMUF3 AND IT HAS THE NEW
30030 REM POLAR ALGORITHM IN IT. THUS, IT WOULD BE SUITABLE TO USE IN
30040 REM THE MAPPER SUB-ROUTINE FOR CRITICAL FREQUENCIES.
30050 REM
30060 REM THE INPUT DATA THAT ARE REQUIRED INCLUDE THE LATITUDE (XN) AND
30070 REM WEST LONGITUDE (YN) OF THE POINT UNDER CONSIDERATION. ALSO,
30080 REM IT WILL NEED THE MONTH (X.MONTH), TIME OF DAY (T.UTC) IN HOURS UTC,
30090 REM THE SUNSPOT NUMBER (R) AND THE RADIATION ANGLE (AE) IN DEGREES
30100 REM ABOVE THE HORIZON.
30110 REM
30120 REM FINALLY, THE VARIABLES IN THE ALGORITHM MUST BE DIMENSIONED IN THE
30130 REM MAIN PROGRAM OR IN THE SUB-ROUTINE WHEN IT IS CALLED. A GUIDE TO
30140 REM THESE REQUIREMENTS IS TO BE FOUND IN THE BEGINNING OF THE
30150 REM MAXIMUF3.BAS PROGRAM ITSELF.
30160 REM
30170 REM * * * * * * * * * * MAXIMUF3 F-LAYER ALGORITHM * * * * * * * * * * *
30180 REM
30190 REM THIS VERSION OF MAXIMUF3 HAS THE NEW POLAR ALGORITHM IN IT!
30200 REM
30210 DIM FF(25)
30220 REM
30230 REM F-2 LAYER CALCULATION
30240 '
30250 CALL MAG.LATITUDE(XN,YN,Z.MAG)
30260 '
30270 T.LOCAL=T.UTC-YN/15
30280 'LOCAL TIME AT XN, YN
30290 '
30300 IF T.LOCAL>24 THEN T.LOCAL=T.LOCAL-24
30310 IF T.LOCAL<0 THEN T.LOCAL=T.LOCAL+24
30320 '
30330 AX=1-.034*COS(30*(X.MONTH-6.25)*RPD):
30340 'ANNUAL VARIATION
30350 '
30360 'MAKE SOUTHERN HEMISPHERE SAME AS NORTHERN 6 MONTHS LATER
30370 Z.MONTH=X.MONTH
30380 IF Z.MAG<0 THEN
30390 Z.MAG=-Z.MAG
30400 Z.MONTH=X.MONTH+6
30410 END IF
30420 '
30430 XH=COS(30*(Z.MONTH-6.5)*RPD)
30440 ' 1 WEEK DELAY ON EQUINOXES
30450 SX=(ABS(XH)+XH)/2
30460 ' F-LAYER LOCAL SUMMER VARIATION
30470 WX=(ABS(XH)-XH)/2
30480 ' F-LAYER LOCAL WINTER VARIATION
30490 '
30500 IF Z.MAG>77.5 THEN
30510 ' POLAR ALGORITHM
30520 SSN=R
30530 ' CHANGE R TO SSN FOR POLAR ALGORITHM
30540 FF.POL1=(3+SX*1.1-WX*.3)*(1+SSN/(150+SX*230-WX*5))
30550 FF.POL2=(3.1*(1-SX)+WX*1.7)*(1-SSN/(210+WX*40))/(95-ABS(XN))-SX*SSN/100/(95-ABS(XN))
30560 FF.POL3=(.04-SX*.02+WX*.01)*(1+SSN/(315+SX*1185-WX*100))*(90-ABS(XN))*SIN(15*(T.LOCAL-7.5+SX*.5-WX*.5-SSN*(1-WX)/(100+SX*50))*RPD)
30570 FF.POL4=(SX*.005+WX*.02*(1+SSN/150))*(90-ABS(XN))*SIN(30*(T.LOCAL-8-WX*2+SSN/150)*RPD)
30580 F0F2=AX*(FF.POL1+FF.POL2+FF.POL3+FF.POL4)
30590 ' foF2 IN POLAR REGIONS
30600 ELSE
30610 TY=T.LOCAL
30620 IF TY<5 THEN TY=T.LOCAL+24
30630 TN=T.LOCAL
30640 IF TN<15+SX-WX*3 THEN TN=T.LOCAL+24
30650 '
30660 Q=(TY-14-SX*2+WX*2-R/(200-SX*50-WX*50))
30670 'Q IS C FACTOR
30680 YF1=Q*(7-SX*3+WX*4-R/(150-WX*75))
30690 IF ABS(YF1)>60 THEN YF1=60
30700 'YF1 IS B*(T-C) IN FRICKER
30710 '
30720 X=(6.5-WX*.5)*(1+R/(170+SX*200+WX*15))
30730 'X IS A FACTOR
30740 '
30750 FF(1)=X*COS(YF1*RPD)*COS((Z.MAG-SX*5+WX*5)*RPD)^.5
30760 ' FF(1) IS THE MAIN FRICKER TERM
30770 '
30780 YA=(TY-8.5-R*SX/125)*(30-R*SX/30)
30790 IF ABS(YA)>89 THEN YA=89
30800 X=(2.3-SX*1.1+WX*.2)
30810 Q=(1+R/(400-SX*320-WX*225))
30820 FA=X*Q*COS(YA*RPD)*COS((Z.MAG-4+SX*4-WX-R*WX/30)*RPD)^24
30830 '
30840 X=(TY-14.5+SX*1.3+WX*.2+R/(75+SX*25+WX*100))
30850 YB=X*(18+SX*8-WX-R*(1-WX*4)/(150-SX*138))
30860 IF ABS(YB)>89 THEN YB=89
30870 X=(4.6-SX*2.6-WX*1.3)*(1-R*(1-SX-WX*7/5)/600)
30880 FB=X*COS(YB*RPD)*COS((Z.MAG-15+WX*3-R*(SX/12+WX/150))*RPD)^48
30890 '
30900 X=(TY-19+SX*2.2+WX*.2-R*(1-SX*5/3)/(100+WX*10))
30910 YC=X*(18+SX*8-WX-R/(50-SX*35+WX*100))
30920 IF ABS(YC)>89 THEN YC=89
30930 X=(3.3-SX*.2+WX*.8)*(1+R/(290-SX*15-WX*130))
30940 Q=X*COS(YC*RPD)
30950 FC=Q*COS((Z.MAG-3-SX*10-R*(1-SX*6/5)/(15+WX*5))*RPD)^48
30960 '
30970 X=(TY-24+SX*.3-WX*.2-R*(1-SX*2)/(200-WX*100))
30980 YD=X*(26+WX*10-R/(75-SX*35-WX*57))
30990 IF ABS(YD)>89 THEN YD=89
31000 X=(2.6-SX*4.7-WX*1.6)*(1+R*(1-SX*17/5)/(180-WX*130))
31010 Q=X*COS(YD*RPD)
31020 FD=Q*COS((Z.MAG-3-SX*4-WX-R/(75-SX*50-WX*15))*RPD)^64
31030 '
31040 Q=(1-SX*7/3-WX*2)
31050 YF3=(TN-28.9+SX*.2+WX*.2-R*Q/600)*(36+WX*9+R*SX/25)
31060 IF ABS(YF3)>89 THEN YF3=89
31070 X=-(1.3+SX*1.1+WX*.2)*(1-R/(170+SX*130+WX*1490))
31080 Q=X*COS(YF3*RPD)
31090 FF(3)=Q*COS((Z.MAG-8+SX*6-WX*2-R*(1-SX*2)/(75-WX*65))*RPD)^16
31100 '
31110 X=(TN-26.5-SX*1.5+WX*3.5-R*WX/75)
31120 YF4=X*(7-SX*.5-WX*2+R*(1-SX)/(50+WX*10))
31130 IF ABS(YF4)>89 THEN YF4=89
31140 X=(1.3+SX*.1-WX*.1)*(1+R*(1-SX*4/3)/(170-WX*85))
31150 FF(4)=X*COS(YF4*RPD)*SIN((Z.MAG+13+SX*2-WX*2)*RPD)^64
31160 '
31170 YF5=(TY-12)*13
31180 IF ABS(YF5)>89 THEN YF5=89
31190 Q=.8*(1-SX-WX)*(1+R/70)
31200 FF(5)=Q*COS(YF5*RPD)*COS((Z.MAG-25-R/15)*RPD)^24
31210 '
31220 YF6=(TN-23-R/100)*(20+R/75)
31230 IF ABS(YF6)>89 THEN YF6=89
31240 FF(6)=R*(1-SX-WX)/60*COS(YF6*RPD)*COS((Z.MAG-18)*RPD)^48
31250 '
31260 YF7=(TN-26)*36
31270 IF ABS(YF7)>89 THEN YF7=89
31280 FF(7)=-SX*1.3*(1-R/150)*COS(YF7*RPD)*COS(Z.MAG*RPD)^64
31290 '
31300 YF8=(TY-13+R/300)*(15+R/75)
31310 IF ABS(YF8)>89 THEN YF8=89
31320 FF(8)=R*WX/33*COS(YF8*RPD)*COS((Z.MAG-52)*RPD)^16
31330 '
31340 Q=FF(1)+FA+FB+FC+FD+FF(3)
31350 F01=Q+FF(4)+FF(5)+FF(6)+FF(7)+FF(8)
31360 '
31370 Q=(TY-10.5+WX*1.5+R*(1-WX*2)/300)
31380 YF9=Q*(60-WX*24-R/(10+WX*20))
31390 IF ABS(YF9)>89 THEN YF9=89
31400 X=(-R*(1-SX)/150+WX*.8*(1+R/175))
31410 Q=X*COS(YF9*RPD)
31420 FF(9)=Q*COS((Z.MAG-20-WX*2+R*(1-WX*33/13)/20)*RPD)^48
31430 '
31440 YF10=(TY-15)*(18-R/75)
31450 IF ABS(YF10)>89 THEN YF10=89
31460 Q=-SX*.8*(1-R/600)
31470 FF(10)=Q*COS(YF10*RPD)*COS((Z.MAG-47-R/40)*RPD)^48
31480 '
31490 YF11=(TY-18.5-WX*.5-R*WX/150)*(30+WX*15)
31500 IF ABS(YF11)>89 THEN YF11=89
31510 X=(SX*.5*(1+R/300)+WX*R/250)
31520 Q=X*COS(YF11*RPD)
31530 FF(11)=Q*COS((Z.MAG-27+WX*7+R*(1-WX*11/6)/25)*RPD)^48
31540 '
31550 YF12=(TY-20+WX-R*(1-WX*2)/100)*(45-R*(1-WX)/15)
31560 IF ABS(YF12)>89 THEN YF12=89
31570 Q=-R*(1-SX-WX*2)
31580 FF(12)=Q/160*COS(YF12*RPD)*COS((Z.MAG-45+WX*3)*RPD)^48
31590 '
31600 YF13=(TY-20.5)*22
31610 IF ABS(YF13)>89 THEN YF13=89
31620 Q=-R*(1-SX-WX)
31630 FF(13)=Q/150*COS(YF13*RPD)*COS((Z.MAG-6+R/17)*RPD)^64
31640 '
31650 YF14=(TY-22-WX+R/150)*(45-WX*27+R*WX/10)
31660 IF ABS(YF14)>89 THEN YF14=89
31670 X=-.4*(1-SX+WX/4)*(1-R/(48-WX*18))
31680 Q=X*COS(YF14*RPD)
31690 FF(14)=Q*COS((Z.MAG-15-WX*5+R/(25-WX*10))*RPD)^64
31700 '
31710 YF15=(TY-22-WX*2-R*(1-WX)/75)*(20+R*(1-WX)/30)
31720 IF ABS(YF15)>89 THEN YF15=89
31730 Q=(-SX*.6+WX*R/100)
31740 FF(15)=Q*COS(YF15*RPD)*COS((Z.MAG-70+WX*5)*RPD)^64
31750 '
31760 Q=(TN-24-SX*1.5-R*(1-SX*2)/75)
31770 YF16=Q*(30-SX*8-R*(1+SX*7/5)/30)
31780 IF ABS(YF16)>89 THEN YF16=89
31790 '
31800 X=.3*(1-SX*13/3-WX)*(1+R*(1-SX*8/5)/150)
31810 FF(16)=X*COS(YF16*RPD)*COS((Z.MAG-32-SX*6-R*SX/15)*RPD)^48
31820 '
31830 YF17=(TN-26.5+R/150)*(22+R/15)
31840 IF ABS(YF17)>89 THEN YF17=89
31850 Q=-.5*(1-SX-WX)*(1-R/65)
31860 FF(17)=Q*COS(YF17*RPD)*COS((Z.MAG-55-R/75)*RPD)^48
31870 '
31880 Q=FF(9)+FF(10)+FF(11)+FF(12)
31890 F02=Q+FF(13)+FF(14)+FF(15)+FF(16)+FF(17)
31900 '
31910 IF WX<>0 THEN
31920 YF18=(TY-8.5)*45
31930 IF ABS(YF18)>89 THEN YF18=89
31940 Q=-.4*(1+R/250)
31950 FF(18)=Q*COS(YF18*RPD)*COS((Z.MAG-60+R/30)*RPD)^64
31960 '
31970 YF19=(TY-9.5)*(20+R/15)
31980 IF ABS(YF19)>89 THEN YF19=89
31990 FF(19)=-.5*(1+R/150)*COS(YF19*RPD)*COS((Z.MAG-68)*RPD)^64
32000 '
32010 YF20=(TY-15-R/35)*(22-R/50)
32020 IF ABS(YF20)>89 THEN YF20=89
32030 Q=.6*(1+R/175)*COS(YF20*RPD)
32040 FF(20)=Q*COS((Z.MAG-27-R/50)*RPD)^64
32050 '
32060 YF21=(TY-17.5-R/100)*45
32070 IF ABS(YF21)>89 THEN YF21=89
32080 FF(21)=.2*(1+R/75)*COS(YF21*RPD)*COS((Z.MAG-70)*RPD)^64
32090 '
32100 YF22=(TY-19-R/75)*(20+R/75)
32110 IF ABS(YF22)>89 THEN YF22=89
32120 Q=-.7*(1+R/450)
32130 FF(22)=Q*COS(YF22*RPD)*COS((Z.MAG-52+R/15)*RPD)^24
32140 '
32150 YF23=(TN-29)*45
32160 IF ABS(YF23)>89 THEN YF23=89
32170 Q=-.6*(1+R/300)
32180 FF(23)=Q*COS(YF23*RPD)*COS((Z.MAG-57+R/15)*RPD)^48
32190 '
32200 F03=FF(18)+FF(19)+FF(20)+FF(21)+FF(22)+FF(23)
32210 '
32220 END IF
32230 '
32240 F0F2=AX*(F01+F02+WX*F03)
32250 'foF2 FOR VERTICAL INCIDENCE
32260 END IF
32270 '
32280 HT=275+R/2
32290 HF=HT
32300 IF Z.MAG<=5 THEN
32310 HF=HT+50
32320 IF T.LOCAL>2 AND T.LOCAL<9 THEN HF=HT+25
32330 IF T.LOCAL>4 AND T.LOCAL<7 THEN HF=HT
32340 ELSEIF Z.MAG<=10 THEN
32350 HF=HT+25+25*SX
32360 IF T.LOCAL>2 AND T.LOCAL<9 THEN HF=HT+25*SX
32370 IF T.LOCAL>4 AND T.LOCAL<7 THEN HF=HT
32380 ELSEIF Z.MAG>=20 AND Z.MAG<=60 THEN
32390 IF T.LOCAL>8 AND T.LOCAL<16 THEN HF=HT+SX*50-WX*25
32400 IF T.LOCAL>23 OR T.LOCAL<3 THEN HF=HT+WX*50
32410 END IF
32420 '
32430 SF=(1-(COS(AE*RPD)*RE/(RE+HF))^2)^(-.5)
32440 ' SECANT FACTOR
32450 F.MUF=(F0F2*SF)
32460 ' CRITICAL FREQUENCY FOR OBLIQUE INCIDENCE
32470 '
32480 END SUB
40000 SUB MAG.LATITUDE(XN,YN,Z.MAG) STATIC
40010 'COMPUTATION OF MAGNETIC LATITUDE
40020 YZ=YN
40030 IF YN<-160 THEN YZ=360+YN
40040 YG=(20-YZ)/50
40050 Z0=20*YG/(1+YG+YG^2)+5*(1-YG/7)^2
40060 Z.MAG=XN-Z0
40070 END SUB
41000 SUB REFLECT (ELEV, WAVE.LEN, SEA%, RMAGV, VPHASE, RMAGH, HPHASE, REFLECT.LOSS) STATIC
41010 'REFLECTION COEFFICIENT CALCULATION
41020 IF SEA% THEN ER = 80: EI = -60 * WAVE.LEN * 4: DH = 4 ELSE ER = 15: EI = -60 * WAVE.LEN * .01: DH = 10
41030 RHO = EXP(-2 * (2 * PI * DH * SIN(ELEV / CNV) / WAVE.LEN) ^ 2)
41040 CA = COS(ELEV / CNV) ^ 2: SA = SIN(ELEV / CNV): SQ1 = ER - CA: PQ1 = .5 * ATN(EI / SQ1): SMAG = SQR(SQ1 ^ 2 + EI ^ 2)
41050 SMAG = SQR(SMAG): SQ1 = SMAG * COS(PQ1): SQ2 = SMAG * SIN(PQ1):
41060 DENH = (SQR((SA + SQ1) ^ 2 + SQ2 ^ 2)): PHASE1 = SQ2: PHASE2 = SA + SQ1: GOSUB 41140: HPHASE = PHASE
41070 NUMH! = (SQR((SA - SQ1) ^ 2 + SQ2 ^ 2)): PHASE1 = -SQ2: PHASE2 = SA - SQ1: GOSUB 41140: HPHASE1 = PHASE
41080 RMAGH = NUMH! / DENH: HPHASE = HPHASE1 - HPHASE
41090 DENV = SQR((SA * ER + SQ1) ^ 2 + (EI * SA + SQ2) ^ 2): PHASE1 = (EI * SA + SQ2): PHASE2 = (ER * SA + SQ1): GOSUB 41140: VPHASE = PHASE
41100 NUMV! = SQR((SA * ER - SQ1) ^ 2 + (EI * SA - SQ2) ^ 2): PHASE1 = (EI * SA - SQ2): PHASE2 = (ER * SA - SQ1): GOSUB 41140: VPHASE1 = PHASE
41110 RMAGV = NUMV! / DENV: VPHASE = VPHASE1 - VPHASE
41120 REFLECT.LOSS = FNDB(.5 * (RMAGH ^ 2 + RMAGV ^ 2) * RHO ^ 2)
41130 EXIT SUB
41140 '4 QUADRANT ARC TANGENT
41150 IF PHASE2 > 0 THEN PHASE = ATN(PHASE1 / PHASE2): RETURN
41160 IF PHASE1 < 0 THEN PHASE = -PI + ATN(PHASE1 / PHASE2) ELSE PHASE = PI + ATN(PHASE1 / PHASE2)
41170 RETURN
41180 END SUB
42000 SUB MULTIPATH (ELEV, WAVE.LEN, H.ANTENNA, XMULTV, XMULTH) STATIC
42010 ' MULTIPATH CALCULATION
42020 CALL REFLECT(ELEV, WAVE.LEN, 0, RMAGV, VPHASE, RMAGH, HPHASE, REFLECT.LOSS)
42030 ALPHAV = VPHASE - 4 * PI * H.ANTENNA * SIN(ELEV / CNV) / WAVE.LEN: XMULTV = FNDB((1 + RMAGV * COS(ALPHAV)) ^ 2 + (RMAGV * SIN(ALPHAV)) ^ 2)
42040 ALPHAH = HPHASE - 4 * PI * H.ANTENNA * SIN(ELEV / CNV) / WAVE.LEN: XMULTH = FNDB((1 + RMAGH * COS(ALPHAH)) ^ 2 + (RMAGH * SIN(ALPHAH)) ^ 2)
42050 XMULT = FNDB(.5 * (FNDBI(XMULTV) + FNDBI(XMULTH)))
42060 END SUB
44000 SUB FIND.OCEAN(XLON,XLAT,SEA%) STATIC
44010 DATA 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384
44020 IF NOT FIRST% THEN
44030 FIRST%=-1
44040 REDIM SEA.MAP(25,180) AS INTEGER,MASK(14) AS INTEGER
44050 RESTORE 44010
44060 FOR I=0 TO 14:READ MASK(I):NEXT
44070 NSEG=VARSEG(SEA.MAP(0,0)):NOFF=VARPTR(SEA.MAP(0,0))
44080 DEF SEG=NSEG:BLOAD "SEA-MAP.DAT",NOFF:DEF SEG
44090 END IF
44100 NX=(XLON):NY=90+XLAT
44110 IF NX<0 THEN NX=360+NX ELSE IF NX>360 THEN NX=NX-360
44120 IF NY<0 THEN NY=0 ELSE IF NY>180 THEN NY=180
44130 MX=NX\15:LX=NX-15*MX
44140 SEA%=SEA.MAP(MX,NY) AND MASK(LX)
44150 IF SEA% THEN SEA%=-1
44160 END SUB
46000 SUB CREATE.OCEAN
46010 DATA 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384
46020 REDIM SEA.MAP(25,180) AS INTEGER,MASK(14) AS INTEGER
46030 RESTORE 46010
46040 FOR I=0 TO 14:READ MASK(I):NEXT
46050 FOR XLAT=-90 TO 90.001
46060 FOR KLON=180 TO -180 STEP -1
46070 XLON=KLON
46080 NX=(180-XLON):NY=90+XLAT
46090 IF NX<0 THEN NX=0 ELSE IF NX>360 THEN NX=360
46100 IF NY<0 THEN NY=0 ELSE IF NY>180 THEN NY=180
46110 MX=NX\15:LX=NX-15*MX
46120 MAP.COLOR=POINT(XLON, XLAT)
46130 SEA%=0
46140 IF MAP.COLOR = 1 THEN
46150 SEA%=-1
46160 SEA.MAP(MX,NY)=SEA.MAP(MX,NY) OR MASK(LX)
46170 END IF
46180 NEXT KLON,XLAT
46190 NSEG=VARSEG(SEA.MAP(0,0)):NOFF=VARPTR(SEA.MAP(0,0))
46200 DEF SEG=NSEG:BSAVE "SEA-MAP.DAT",NOFF,2*26*181:DEF SEG
46210 ERASE SEA.MAP
46220 END SUB